package com.interview.two.service;

import com.interview.two.mapper.AccountMapper;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.transaction.interceptor.TransactionInterceptor;

import javax.annotation.Resource;
import java.io.FileInputStream;
import java.io.FileNotFoundException;

@Service
public class Service2 {

    @Resource
    private AccountMapper accountMapper;

    /** 若是 你手动try-catch 了异常，（并没有将异常传播出去），将导致事务失效。
     * 要知道Spring执行mysql事务是通过 代理对象执行的。当目标对象出现异常，并被try-catch的时候，代理对象不知道。也就很容易理解，为啥事务没有回滚的
     * @param from 
     * @param to
     * @param amount
     */
    @Transactional(rollbackFor = Exception.class)
    public void transfer(int from, int to, int amount)  {
        try {
            int fromBalance = accountMapper.findBalanceBy(from);
            if (fromBalance - amount >= 0) {
                accountMapper.update(from, -1 * amount);
                new FileInputStream("aaa");
                accountMapper.update(to, amount);
            }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
            // 解决方法一：将异常包装为 一个运行时异常
//            throw new RuntimeException(e);
            // 解决方法二：调用事务拦截方法（事务底层是通过AOP实现的），告诉当前事务状态
            TransactionInterceptor.currentTransactionStatus().setRollbackOnly();
        }
    }
}